# 查重实现类
import base64
import io
import mimetypes
import requests
from io import BytesIO
from requests.exceptions import ConnectTimeout, ReadTimeout, HTTPError
import numpy as np
import cv2
from PIL import Image
# 判断是否是文件类型
def is_image(filename):
        mime = mimetypes.guess_type(filename)[0]
        return mime and mime.startswith('image/')

def getFileObj(file):
    if file.file_base64:
        file_obj = getFileByBase64(file.file_base64)
        return file_obj
    if file.file_url:
        token = file.token
        file_url = file.file_url
        file_obj = down_image_from_url(file_url, token)
        return file_obj
    else:
        return file.multipart_file


#base64转文件
def getFileByBase64(baseStr):
    decoded_bytes = base64.b64decode(baseStr)
    # 使用io库创建一个BytesIO对象，它允许我们将字节数据当作文件流来处理
    file_obj = io.BytesIO(decoded_bytes)
    # 打开BytesIO对象作为一个图像文件，并转换为PIL图像对象
    # file_obj = Image.open(image_stream)
    return file_obj


# 根据文件的url下载文件
def down_image_from_url(url, token):
    # 要设置的cookie，这是一个字典，其中键是cookie的名字，值是cookie的值
    timeout = 5.0  # 设置超时时间为5秒
    try:
        if token is not None:
            cookies = {
                'Sunyard-Token': token
            }
            response = requests.get(url, cookies=cookies, stream=True, timeout=timeout)
        else:
            response = requests.get(url, stream=True, timeout=timeout)
        if response.status_code == 200:
            image = BytesIO(response.content)
            image_bytes = image.getvalue()  # 获取字节数据

            # OpenCV 需要一个特定的格式来解码，这里我们假设它是 JPEG（你需要根据实际情况调整）
            # 注意：这种方法不是最直接的，因为它涉及到了不必要的数组复制和可能的格式转换
            nparr = np.frombuffer(image_bytes, np.uint8)
            img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)  # IMREAD_COLOR 表示读取彩色图像
            print(img)
            # 重置文件指针到开头
            return img
        else:
            print(f"无法从 {url} 下载图片。HTTP状态码：{response.status_code}")
    except ConnectTimeout:
        print("连接超时")
    except ReadTimeout:
        print("读取超时")
    except HTTPError as http_err:
        print(f"HTTP错误发生: {http_err}")
    except Exception as err:
        print(f"发生其他错误: {err}")

    return None

def getFileByBase64(baseStr):
    decoded_bytes = base64.b64decode(baseStr)
    # 使用io库创建一个BytesIO对象，它允许我们将字节数据当作文件流来处理
    file_obj = io.BytesIO(decoded_bytes)
    # 打开BytesIO对象作为一个图像文件，并转换为PIL图像对象
    file_obj = Image.open(file_obj)
    # 将 PIL 图像转换为 NumPy 数组
    numpy_array = np.array(file_obj)
    return numpy_array

 # 旋转图像
def rotate_image( image, angle):
    rotated_img = image.rotate(angle)
    return rotated_img

def file_to_base64(file_path):
    with open(file_path, 'rb') as file:
        file_content = file.read()
        base64_content = base64.b64encode(file_content)
        return base64_content.decode('utf-8')  # 转换为字符串格式